home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
iguana
/
incosrc
/
incosrc.exe
/
BALLS
/
BALLS.ASM
next >
Wrap
Assembly Source File
|
1993-08-14
|
21KB
|
839 lines
; ------------------------------ BALLS.ASM ------------------------------
; Bye Jare of VangeliSTeam. Want more comments? Write'em. O:-)
TRACE = 0
.MODEL SMALL
.STACK 400
.386
DOSSEG
LOCALS
JUMPS
INCLUDE VGASM.INC
INCLUDE VBLIB.INC
INCLUDE VTASM.INC
SCRW = 80
CRDMULT = 3
SZBALL = 16
BALLPIXSZ = 16*15-12*4
NBALLS = 20
SCREENOFF1 = SCRW*216*0
SCREENOFF2 = SCRW*216*1
SCREENOFF3 = SCRW*216*2
LG01 SEGMENT WORD PUBLIC
EXTRN LogoBall : BYTE
ENDS
.CODE
.STARTUP
CLD
CALL SetupBallsVideo
CALL CreateBallsPix
XOR SI,SI
CALL InitializeTimerVBL
CALL InitMusic
CALL VTBeginSync
CALL VTWaitForStart
CALL VBLVSync
MainLoop:
MOV CX,4000
; LOOP $
SetBorder 0, 0, 0
WaitForDisplay
CALL SetDisplayPage
CALL VBLVSync
MOV [NFrames],AX
; VSync
INC [FrameCounter]
MOV CX,4000
; LOOP $
SetBorder 0, 0, 63
CALL CreateBalls
MOV CX,[NFrames]
MOV CX,1
@@mlp:
PUSH CX
CALL AnimateBalls
CALL TestCollisions
POP CX
LOOP @@mlp
SetBorder 63,63,0
CALL CallMusic
MOV AH,1
INT 16h
JNZ @@Bye
CMP [DoNotStop],0
JZ ByeBye
JMP MainLoop
@@Bye:
MOV AH,0
INT 16h
ByeBye:
CALL EndTimerVBL
; CALL ZeroPalette
; MOV AX,3
; INT 10h
CALL VTConnectTimer
CALL RestoreSystemTime
MOV AX,4C00h
INT 21h
; =======================================
SetupBallsVideo:
COMMENT #
CALL ZeroPalette
MOV AX,13h
INT 10h
CALL ZeroPalette
VSync
MOV DX,3C0h
MOV AL,30h
OUT DX,AL
MOV AL,01100001b
OUT DX,AL
MOV DX,3c4h
MOV AX,604h ; "Unchain my heart". And my VGA...
OUT DX,AX
MOV AX,0F02h ; All planes
OUT DX,AX
; Comienzo del modo de Hz reducidos.
MOV DX,3D4h
MOV CX,18h
MOV SI,OFFSET CRTCregs
@@cl1:
LODSW
; OUT DX,AX
LOOP @@cl1
; Final del modo de Hz reducidos.
MOV AX,14h ; Disable dword mode
OUT DX,AX
MOV AX,0E317h ; Enable byte mode.
OUT DX,AX
#
VSync
XOR AX,AX
MOV DX,3C8h
OUT DX,AL
INC DX
DEC AX
MOV CX,256
@@p1:
OUT DX,AL
OUT DX,AL
OUT DX,AL
LOOP @@p1
PUSH DS
POP ES
MOV DI,OFFSET SourcePalette
MOV CX,256*3/2
MOV AX,3F3Fh
REP STOSW
MOV DX,3c4h
MOV AX,0F02h ; All planes
OUT DX,AX
XOR DI,DI ; Clear the screen. All planes.
MOV AX,0A000h
MOV ES,AX
MOV CX,8000h
XOR AX,AX
REP STOSW
PUSH DS
MOV AX,SEG LogoBall
MOV DS,AX
MOV SI,OFFSET LogoBall
MOV BX,104h
@@lp0:
MOV DX,3C4h
MOV AL,02h ; One plane at a time.
MOV AH,BH
OUT DX,AX
MOV DI,16*SCRW
PUSH SI
MOV CX,64000/4
@@lp1:LODSB
MOV ES:[DI+SCRW*216*2],AL
MOV ES:[DI+SCRW*216],AL
STOSB
ADD SI,3
LOOP @@lp1
POP SI
INC SI
SHL BH,1
DEC BL
JNZ @@lp0
POP DS
CALL SetDisplayPage
VSync
MOV CX,32
@@f1:
PUSH CX
VSync
MOV SI,OFFSET SourcePalette
MOV CX,128
XOR AL,AL
CALL DumpPalette
VSync
MOV SI,OFFSET SourcePalette+128*3
MOV CX,128
MOV AL,128
CALL DumpPalette
REPT 2
MOV SI,OFFSET NormalPalette
MOV DI,OFFSET SourcePalette
MOV CX,256
XOR DH,DH
CALL FadePal
ENDM
POP CX
LOOP @@f1
VSync
MOV SI,OFFSET NormalPalette
MOV CX,256
XOR AL,AL
CALL DumpPalette
RET
; =======================================
EraseBall:
MOV DI,[SI+12]
MOV CL,[SI+10]
TEST [FrameCounter],1
JNZ @@c1
MOV DI,[SI+14]
MOV CL,[SI+11]
@@c1:
MOV SI,SCREENOFF3
CMP DI,SCREENOFF1
JZ @@ret
CMP DI,SCREENOFF2
JZ @@ret
JC @@goon
SUB SI,SCREENOFF2
@@goon:
ADD SI,DI
MOV DX,3C4h
MOV AX,0F02h ; All planes
OUT DX,AX
MOV DX,3CEh ; Bitmask...
MOV AX,00008h ; 00000000b
OUT DX,AX
PUSH DS
MOV AX,0A000h
MOV ES,AX
MOV DS,AX
XOR AX,AX
TEST CL,3
JNZ @@noexact
MOV CX,SCRW-4
REPT 15
MOVSB
MOVSB
MOVSB
MOVSB
ADD DI,CX
ADD SI,CX
ENDM
JMP @@bye
@@noexact:
MOV CX,SCRW-5
REPT 15
MOVSB
MOVSB
MOVSB
MOVSB
MOVSB
ADD DI,CX
ADD SI,CX
ENDM
@@bye:
MOV DX,3CEh ; Bitmask...
MOV AX,0FF08h ; 00000000b
OUT DX,AX
POP DS
@@ret:
RET
ROTPLANE MACRO
LOCAL @@c1
ADD AH,AH
TEST AH,10h
JZ @@c1
INC BX
MOV AH,1
@@c1:
MOV DI,BX
ENDM
RawDrawBall:
CMP DI,SCREENOFF1
JZ @@bye
CMP DI,SCREENOFF2
JNZ @@goon
@@bye:
RET
@@goon:
MOV AL,BL
MOV BL,BALLPIXSZ
MUL BL
MOV SI,OFFSET BallsPix
ADD SI,AX
MOV BX,0A000h
MOV ES,BX
MOV BX,DI
MOV DX,3C4h
MOV AX,0102h ; One plane at a time.
SHL AH,CL
MOV CX,SCRW-4
OUT DX,AX ; Plane #1
ADD DI,2
MOVSB
ADD DI,SCRW-3+1
MOVSW
MOVSB
ADD DI,SCRW-4+1
MOVSW
MOVSB
ADD DI,SCRW-4+1
MOVSW
MOVSB
ADD DI,SCRW-4+1
MOVSW
MOVSB
ADD DI,CX
REPT 5
MOVSW
MOVSW
ADD DI,CX
ENDM
INC DI
MOVSW
MOVSB
ADD DI,SCRW-4+1
MOVSW
MOVSB
ADD DI,SCRW-4+1
MOVSW
MOVSB
ADD DI,SCRW-4+1
MOVSW
MOVSB
ADD DI,SCRW-4+2
MOVSB
ROTPLANE
OUT DX,AX ; Plane #2
INC DI
MOVSW
ADD DI,SCRW-3+1
MOVSW
ADD DI,SCRW-4+2
MOVSW
MOVSB
ADD DI,CX
REPT 9
MOVSW
MOVSW
ADD DI,CX
ENDM
INC DI
MOVSW
MOVSB
ADD DI,SCRW-4+1
MOVSW
ADD DI,SCRW-4+2
MOVSW
ROTPLANE
OUT DX,AX ; Plane #3
INC DI
MOVSW
ADD DI,SCRW-3+1
MOVSW
ADD DI,SCRW-4+1
MOVSW
MOVSB
ADD DI,SCRW-4+1
REPT 9
MOVSW
MOVSW
ADD DI,CX
ENDM
MOVSW
MOVSB
ADD DI,SCRW-4+2
MOVSW
ADD DI,SCRW-4+2
MOVSW
ROTPLANE
OUT DX,AX ; Plane #4
INC DI
MOVSB
ADD DI,SCRW-4+2
MOVSW
MOVSB
ADD DI,SCRW-4+1
MOVSW
MOVSB
ADD DI,SCRW-4+1
MOVSW
MOVSB
ADD DI,SCRW-4+1
MOVSW
MOVSB
ADD DI,SCRW-4+1
REPT 5
MOVSW
MOVSW
ADD DI,CX
ENDM
MOVSW
MOVSB
ADD DI,SCRW-4+1
MOVSW
MOVSB
ADD DI,SCRW-4+1
MOVSW
MOVSB
ADD DI,SCRW-4+1
MOVSW
MOVSB
ADD DI,SCRW-4+2
MOVSB
RET
; =======================================
CalcCoord:
MOV DI,[SI]
SHR DI,CRDMULT
MOV CX,DI
AND CL,3
SHR DI,2
MOV AX,200 SHL CRDMULT
SUB AX,[SI+2]
SHR AX,CRDMULT
; NEG AX
; ADD AX,216
MOV DX,SCRW
MUL DX
ADD DI,AX
CMP DI,SCREENOFF2
JC @@ok
XOR DI,DI
@@ok:
RET
; =======================================
MoveBall:
MOV BP,(320-16) SHL CRDMULT
CALL @@movcoord
MOV BP,(250) SHL CRDMULT
ADD SI,2
@@movcoord:
MOV AX,[SI]
MOV DX,[SI+4]
ADD AX,DX
CMP AX,BP
JC @@ok
NEG DX
ADD AX,DX
MOV [SI+4],DX
@@ok:
MOV [SI],AX
RET
; =======================================
AnimateBalls:
DEC CX
MOV [DrawFlag],CX
MOV SI,OFFSET BallCoord
MOV CL,[NBalls]
OR CL,CL
JZ @@bye
@@l1:
PUSH CX
PUSH SI
CALL EraseBall
POP SI
ADD SI,SZBALL
POP CX
DEC CL
JNZ @@l1
MOV [DoNotStop],0
MOV SI,OFFSET BallCoord
MOV CL,[NBalls]
@@l2:
PUSH CX
PUSH SI
CALL MoveBall
MOV BX,0
MOV AL,0
CALL VTCheckSemaphore
POP SI
JNZ @@bail
DEC WORD PTR [SI+3*2] ; Gravedad.
MOV [DoNotStop],1
JMP @@goon
@@bail:
INC WORD PTR [SI+3*2] ; Antigravedad.
CMP WORD PTR [SI+1*2],216 SHL CRDMULT
JNC @@jc1
MOV [DoNotStop],1
JMP @@goon
@@jc1:
MOV WORD PTR [SI],0
MOV WORD PTR [SI+1*2],250 SHL CRDMULT
MOV WORD PTR [SI+2*2],0
MOV WORD PTR [SI+3*2],0
@@goon:
PUSH SI
CMP [DrawFlag],0
JNZ @@nx
CALL CalcCoord
TEST [FrameCounter],1
JNZ @@c1
ADD DI,SCREENOFF2
MOV [SI+14],DI
MOV [SI+11],CL
JMP @@cc
@@c1:
MOV [SI+12],DI
MOV [SI+10],CL
@@cc:
MOV BL,[SI+8]
CALL RawDrawBall
@@nx:
POP SI
ADD SI,SZBALL
POP CX
DEC CL
JNZ @@l2
@@bye:
RET
; =======================================
TestCollisions:
MOV SI,OFFSET BallCoord
MOV CL,[NBalls]
OR CL,CL
JNZ @@l1
RET
@@l1:
PUSH CX
PUSH SI
DEC CL
JZ @@next
XOR CH,CH
LEA DI,[SI+SZBALL]
@@l2:
MOV BP,[SI]
SUB BP,[DI]
JNS @@c1
NEG BP ; BP = ABS(deltaX).
@@c1:
CMP BP,16 SHL CRDMULT
JGE @@nx2
MOV BX,[SI+2]
SUB BX,[DI+2]
JNS @@c2
NEG BX ; BX = ABS(deltaY).
@@c2:
CMP BX,16 SHL CRDMULT
JGE @@nx2
SetBorder 63, 63, 63
MOV AX,BP
IMUL AX
MOV BP,AX
MOV AX,BX
IMUL AX
ADD BP,AX
CMP BP,16*16 SHL (CRDMULT*2)
JNC @@nx2
; Hay colisión.
INC CH ; There is a collision.
CMP [SI+9],CL ; The same ball as before?
JZ @@nx2 ; If so, don't bounce.
MOV [SI+9],CL ; Mark this ball.
CMP BX,13 SHL CRDMULT
JC @@nox
MOV AX,[SI+6] ; Swap velY.
SUB AX,[DI+6]
SUB [SI+6],AX
ADD [DI+6],AX
JMP @@nx2
@@nox:
CMP BX,3 SHL CRDMULT
JNC @@xy
MOV AX,[SI+4] ; Swap velX.
SUB AX,[DI+4]
SUB [SI+4],AX
ADD [DI+4],AX
JMP @@nx2
@@xy:
MOV BX,[SI+4] ; Swap both speeds half.
SUB BX,[DI+4]
MOV DX,[SI+6]
SUB DX,[DI+6]
SAR BX,1
SUB [SI+4],BX
SUB [SI+6],BX
ADD [DI+4],BX
ADD [DI+6],BX
SAR DX,1
SUB [SI+4],DX
SUB [SI+6],DX
ADD [DI+4],DX
ADD [DI+6],DX
@@nx2:
ADD DI,SZBALL
DEC CL
JNZ @@l2
OR CH,CH ; If no collisions occured,
JNZ @@next
MOV BYTE PTR [SI+9],CH ; ...clear collBall flag.
@@next:
POP SI
POP CX
ADD SI,SZBALL
DEC CL
JNZ @@l1
RET
; =======================================
CreateBalls:
CMP [NBalls],NBALLS
JNC @@bye
CMP [FrameCounter],2
;COMMENT #
JC @@create
CMP [FrameCounter],135
JZ @@create
CMP [FrameCounter],373
JZ @@create
CMP [FrameCounter],1070
JC @@bye
;#
TEST [FrameCounter],7
JNZ @@bye
@@create:
MOV BL,[NBalls]
INC [NBalls]
XOR BH,BH
MOV AX,BX
MOV DL,13
DIV DL
SHL BX,4 ;SZBALL
MOV DI,OFFSET BallCoord
ADD DI,BX
MOV WORD PTR [DI],200 SHL CRDMULT
MOV WORD PTR [DI+2],216 SHL CRDMULT
MOV WORD PTR [DI+4],-(1 SHL CRDMULT)
MOV WORD PTR [DI+6],0
MOV BYTE PTR [DI+8],AH
MOV BYTE PTR [DI+9],0
MOV BYTE PTR [DI+10],0
MOV BYTE PTR [DI+11],0
MOV WORD PTR [DI+12],0
MOV WORD PTR [DI+14],0
@@bye:
RET
; =======================================
SetDisplayPage:
MOV DX,3D4h
MOV BX,SCREENOFF1+16*SCRW
TEST [FrameCounter],1
JNZ @@scrst
MOV BX,SCREENOFF2+16*SCRW
@@scrst:
MOV AL,0Ch
MOV AH,BH
OUT DX,AX
INC AL
MOV AH,BL
OUT DX,AX
RET
; =======================================
CreateBallsPix:
MOV CL,NBALLS
MOV DI,OFFSET BallsPix
XOR CH,CH
@@l1:
MOV SI,OFFSET ORGBallPix
CALL @@r1
MOV SI,OFFSET ORGBallPix+1
CALL @@r1
MOV SI,OFFSET ORGBallPix+2
CALL @@r1
MOV SI,OFFSET ORGBallPix+3
CALL @@r1
ADD CH,6
DEC CL
JNZ @@l1
RET
@@r1:
MOV BL,15*16/4
@@l2:
MOV AL,[SI]
OR AL,AL
JZ @@nopix
ADD AL,CH
MOV [DI],AL
INC DI
@@nopix:
ADD SI,4
DEC BL
JNZ @@l2
RET
; =======================================
; =======================================
; =======================================
.DATA
CRTCregs LABEL BYTE ; Modo 13h
DB 11h, 04h ; End vertical retrace. (0-0Fh) ; DB 11h, 8Eh
DB 00h, 64h ; Horizontal total. ; DB 00h, 5Fh
DB 01h, 4Fh ; Horizontal display enable end. ; DB 01h, 4Fh
DB 02h, 50h ; Start horizontal blanking. ; DB 02h, 50h
DB 03h, 80h+07h ; End horizontal blanking. (0-1Fh) ; DB 03h, 82h
DB 04h, 5Bh ; Start horizontal retrace. ; DB 04h, 54h
DB 05h, 80h+05h ; End horizontal retrace. (0-1Fh) ; DB 05h, 80h
DB 06h,0FFh ; Vertical total. (+7.0 +7.5) ; DB 06h, BFh
DB 07h, 00011111b ; Overflow (high bits of vertical registers). ; DB 07h, 1Fh
DB 08h, 00h ; DB 08h, 00h
DB 09h, 41h ; DB 09h, 41h
DB 0Ah, 00h ; DB 0Ah, 00h
DB 0Bh, 00h ; DB 0Bh, 00h
DB 0Ch, 00h ; DB 0Ch, 00h
DB 0Dh, 00h ; DB 0Dh, 00h
DB 0Eh, 00h ; DB 0Eh, 00h
DB 0Fh, 00h ; DB 0Fh, 00h
DB 10h,0C0h ; Start vertical retrace. (+7.2 +7.7) ; DB 10h, 9Ch
;
; 11h ────┘ ; End vertical retrace. (0-0Fh)
DB 12h, 8Fh ; Vertical display enable end. (+7.1 +7.6) ; DB 12h, 8Fh
DB 13h, 28h ; DB 13h, 28h
DB 14h, 40h ; DB 14h, 40h
DB 15h,097h ; Start vertical blanking. (+7.3 +9.5) ; DB 15h, 96h
DB 16h,0F8h ; End vertical blanking. ; DB 16h, B9h
DB 17h,0A3h ; DB 17h, A3h
DB 18h,0FFh ; DB 18h, FFh
FrameCounter DW 0
NBalls DB 0
DoNotStop DB 1
NFrames DW 0
DrawFlag DW 0
ORGBallPix LABEL BYTE
DB 0, 0, 0, 0, 0, 2, 3, 3, 2, 2, 1, 0, 0, 0, 0, 0
DB 0, 0, 0, 2, 4, 4, 4, 4, 3, 3, 3, 2, 1, 0, 0, 0
DB 0, 0, 2, 4, 4, 5, 5, 4, 4, 3, 3, 3, 2, 1, 0, 0
DB 0, 2, 4, 5, 6, 6, 5, 4, 4, 3, 3, 3, 2, 2, 1, 0
DB 0, 4, 4, 6, 6, 6, 5, 4, 4, 3, 3, 3, 2, 2, 2, 0
DB 2, 4, 5, 6, 6, 5, 5, 4, 3, 3, 3, 3, 2, 2, 2, 1
DB 3, 4, 5, 5, 5, 5, 4, 4, 3, 3, 3, 2, 2, 2, 2, 1
DB 2, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 1, 1
DB 2, 3, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1
DB 1, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1
DB 0, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 0
DB 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0
DB 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0
DB 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0
DB 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
NormalPalette LABEL BYTE
INCLUDE BALLSPAL.INC
UDATASEG
BallsPix LABEL BYTE
DB NBALLS*BALLPIXSZ DUP (?)
BallCoord LABEL WORD
DB NBALLS*SZBALL DUP (?)
SourcePalette DB 256*3 DUP (?)
END
; ------------------------------ End of BALLS.ASM ---------------------------